/** */
package com.ttbj.core.session;

 

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ttbj.core.util.RegexUtil;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * session工具类
 * <p>
 * 获取sessionId，设置指定域下sessionId
 * 
 * @Author: Daniel
 * @CreateDate: 2015-4-28 下午01:50:36
 * @Version: V1.0
 * 
 */
public class CommonSessionUtil {

	/**
	 * 根据cookieName，request获取SessionID
	 * <p>
	 * 如果存在，直接返回；如果不存在，则设置保存cookieId到response中，并返回给浏览器。
	 * <p>
	 * TODO 需要判断localhost本地测试的url
	 * 
	 * @date 2016年10月11日 下午6:16:35
	 * 
	 * @param cookieName
	 *            cookie名称
	 * @param cookieValuePrefix
	 *            cookie值前缀
	 * @param request
	 * @param response
	 * @return sessionID
	 */
	public static String getSessionID(String cookieName, String cookieValuePrefix, HttpServletRequest request, HttpServletResponse response) {
		String sessionID = null;
		Cookie[] cookies = request.getCookies();
		if (cookies != null) {
			for (int i = 0; sessionID == null && i < cookies.length; i++) {
				Cookie cookie = cookies[i];
				if (cookie.getName().equals(cookieName) && !"".equals(cookie.getValue())) {
					sessionID = cookie.getValue();
					return sessionID;
				}
			}
		}

		if (sessionID == null) {
			sessionID = cookieValuePrefix + request.getSession().getId();
			Cookie cookie = new Cookie(cookieName, sessionID);
			cookie.setPath(CommonSessionConstants.URL_SLASH);

			/** 内网测试开发走ip方式，不设置domain域 ，如果设置域名访问时，设置domain */
			String domain = RegexUtil.getDomainNameFromUrl(request.getRequestURL().toString());
			Pattern pattern = Pattern.compile(CommonSessionConstants.PATTERN_IP);
			Matcher matcher = pattern.matcher(domain);
			if (!matcher.find()) {
				cookie.setDomain(CommonSessionConstants.URL_DOT + domain);
			}

			response.addCookie(cookie);
		}
		return sessionID;
	}

	/**
	 * 根据cookieName，request获取SessionID
	 * <p>
	 * 如果存在，直接返回；如果不存在，则设置保存cookieId到response中，并返回给浏览器。
	 * 
	 * @date 2016年10月11日 下午6:16:35
	 * 
	 * @param cookieName
	 *            cookie名称
	 * @param request
	 * @param response
	 * @return sessionID
	 */
	public static String getSessionID(String cookieName, HttpServletRequest request, HttpServletResponse response) {
		return getSessionID(cookieName, CommonSessionConstants.DEFAULT_COOKIE_VALUE_PREFIX, request, response);
	}

	/**
	 * 根据request获取SessionID
	 * <p>
	 * 如果存在，直接返回；如果不存在，则设置保存cookieId到response中，并返回给浏览器。
	 * 
	 * @author: Daniel
	 * @CreateDate: 2015-4-27 下午09:55:31
	 * @Version: V1.0
	 * 
	 * @param request
	 * @param response
	 * @return
	 * 
	 */
	public static String getSessionID(HttpServletRequest request, HttpServletResponse response) {
		return getSessionID(CommonSessionConstants.DEFAULT_COOKIE_NAME, request, response);
	}

	/**
	 * 根据cookieName、request获取SessionID
	 * <p>
	 * 若不存在，返回默认JSESSIONID，存在过期或者被修改的问题。
	 * 
	 * @Author: Daniel
	 * @CreateDate: 2015-4-28 下午01:59:24
	 * @Version: V1.0
	 * 
	 * @param cookieName
	 *            cookie名称
	 * @param request
	 * @return sessionID
	 * 
	 */
	@Deprecated
	public static String getSessionID(String cookieName, HttpServletRequest request) {
		String sessionID = null;
		Cookie[] cookies = request.getCookies();
		if (cookies != null) {
			for (int i = 0; sessionID == null && i < cookies.length; i++) {
				Cookie cookie = cookies[i];
				if (cookie.getName().equals(cookieName) && !"".equals(cookie.getValue())) {
					sessionID = cookie.getValue();
					return sessionID;
				}
			}
		}
		/** 若不存在，返回默认JSESSIONID，存在过期或者被修改的问题。 */
		if (sessionID == null) {
			sessionID = request.getSession().getId();
		}
		return sessionID;
	}

	/**
	 * 根据request获取SessionID
	 * <p>
	 * 若不存在，返回默认JSESSIONID，存在过期或者被修改的问题。
	 * 
	 * @Author: Daniel
	 * @CreateDate: 2015-4-28 下午01:59:24
	 * @Version: V1.0
	 * 
	 * @param request
	 * @return sessionID
	 * 
	 */
	@Deprecated
	public static String getSessionID(HttpServletRequest request) {
		return getSessionID(CommonSessionConstants.DEFAULT_COOKIE_NAME, request);
	}
}
